﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using LogicaNegocio;
using Entidades;

namespace PresentacionEscritorio
{
    public partial class frmEnviarSMS : Form
    {
        public long nroCel { get; set; }
        public long idTurno { get; set; }

        public frmEnviarSMS()
        {
            InitializeComponent();
        }

        private void frmEnviarSMS_Load(object sender, EventArgs e)
        {
            obtenerPuertosSeriePC();
            panel2.Enabled = false;

            txtNroTelefono.Text = nroCel.ToString();

            obtenerDatosTurno();
        }

        private void obtenerDatosTurno()
        {
            Turno t = GestorAgendaTurnos.obtenerDatosRecordatorioTurno(idTurno);
            String sms = "Le recordamos que tiene turno asignado para " + t.EspMedico.NombreEspecialidad + " el dia " + t.FechaTurno.ToShortDateString() + " a las " + t.HoraTurno.ToString();
            txtSMS.Text = sms;
        }

        //obtener los puertos serie (COM) disponibles en la pc
        private void obtenerPuertosSeriePC()
        {
            List<string> puertosSerie = new List<string>();
            try
            {
                foreach (string puertosSerieObtenido in SerialPort.GetPortNames())
                {
                    puertosSerie.Add(puertosSerieObtenido);
                }
                cmbPuertoUSB.DataSource = puertosSerie;
            }
            catch (Exception ex)
            {
                MessageBox.Show("error: " + ex.Message);
                throw;
            }

        }

        private void btnConectar_Click(object sender, EventArgs e)
        {
            if (btnConectar.Text == "Conectar")
            {
                abrirPuertoSerie();

                //vemos si efectivamente hay un modem en ese puerto serie
                char c = (char)13; //salto de linea
                serialPort1.Write("AT" + c);

                //esperamos un segundo para dar tiempo a la comunicación serie
                System.Threading.Thread.Sleep(1000);

                if (serialPort1.ReadExisting().IndexOf("OK") >= 1)
                {
                    toolstripEstadoModem.Text = "Módem GSM activo";
                    toolstripEstadoModem.ForeColor = Color.Green;
                }
                else
                {
                    toolstripEstadoModem.Text = "Módem GSM no encontrado";
                    toolstripEstadoModem.ForeColor = Color.Red;
                }

                //limpiamos el buffer de entrada del modem GSM
                serialPort1.DiscardInBuffer();

                //ahora vemos si el módem está conectado a una red GSM
                serialPort1.Write("AT+CREG?" + c);
                System.Threading.Thread.Sleep(1000);

                //si el resultado del comando devuelve (0,1) tenemos red
                if (serialPort1.ReadExisting().IndexOf("0,1") >= 1)
                {
                    toolStripRedMovil.Text = "Red móvil disponible";
                    toolStripRedMovil.ForeColor = Color.Green;
                }
                else
                {
                    toolStripRedMovil.Text = "Red móvil no disponible";
                    toolStripRedMovil.ForeColor = Color.Red;
                }
                //limpiamos de nuevo el buffer de entrada del modem GSM
                serialPort1.DiscardInBuffer();

                //cambiamos el nombre del boton
                btnConectar.Text = "Desconectar";

                //habilitamos el panel para enviar sms
                panel2.Enabled = true;
            }
            else
            {
                //cerramos el puerto
                serialPort1.Close();

                //deshabilitamos el envio de sms
                panel2.Enabled = false;

                //volvemos el boton a su nombre original
                btnConectar.Text = "Conectar";
            }

        }

        private void abrirPuertoSerie()
        {
            try
            {
                if (serialPort1.IsOpen)
                    serialPort1.Close();

                serialPort1.PortName = cmbPuertoUSB.SelectedValue.ToString();
                serialPort1.BaudRate = 9600;
                serialPort1.DataBits = 8;
                serialPort1.StopBits = StopBits.One;
                serialPort1.Parity = Parity.None;
                serialPort1.Handshake = Handshake.None;
                serialPort1.DtrEnable = false;
                serialPort1.ReadBufferSize = 1024;
                serialPort1.WriteBufferSize = 1024;
                serialPort1.WriteTimeout = 500;
                serialPort1.RtsEnable = true;
                serialPort1.Encoding = System.Text.Encoding.Default;

                serialPort1.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show("error al abrir al puerto serie: " + ex.Message);
                throw;
            }
        }

        private void btnEnviarSMS_Click(object sender, EventArgs e)
        {
            if (validarSMS())
            {
                try
                {
                    char saltoLinea = (char)13;
                    //Activamos la función de SMS en el modem GSM
                    serialPort1.Write("AT+CMGF=1" + saltoLinea);
                    System.Threading.Thread.Sleep(1000);

                    //Ahora establecemos el nro de teléfono destino del sms
                    char comillasDoble = (char)34;
                    serialPort1.Write("AT+CMGS=" + comillasDoble + txtNroTelefono.Text + comillasDoble + saltoLinea);
                    System.Threading.Thread.Sleep(1000);

                    //Enviar SMS
                    char finBloque = (char)26; //fin de transmision de bloque
                    serialPort1.Write(txtSMS.Text + finBloque);
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(1000);
                    if (serialPort1.ReadExisting().IndexOf("OK") > 0)
                    {
                        MessageBox.Show("SMS enviado a:" + txtNroTelefono.Text);
                    }
                    else
                        //Error no esposible el envio
                        MessageBox.Show("No es posible el envio del mensaje");
                    serialPort1.DiscardInBuffer();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error al enviar sms: " + ex.Message);
                    throw;
                }
            }//fin if
        }

        private bool validarSMS()
        {
            bool res = true;
            string error = "";
            if (string.IsNullOrEmpty(txtNroTelefono.Text))
            {
                res = false;
                error += "Debe ingresar el número de telefono \n\r";
            }
            if (string.IsNullOrEmpty(txtSMS.Text))
            {
                res = false;
                error += "Ingrese el contenido del mensaje de texto";
            }

            if (!res)
            {
                MessageBox.Show("Datos incompletos: \n\r" + error);
            }
            return res;
        }
    }
}
